// Copyright (C) 2022 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
//
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<广西木子科技有限公司>，授权编号：<NT220402151538>，代码指纹：<A.648883738.885>，技术对接人微信：<ID: Lingmuziyi>】
// 【授权寄送：<收件：李先生、地址：南宁市科园西十路11号国电智能大厦1101F、电话：17736659550、邮箱：yingshashou@vip.qq.com>】
//
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
//
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rainbowchat.http.file.d;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.httpfile.FileDownload;
import com.eva.framework.utils.LoggerFactory;
import com.x52im.rainbowchat.http.file.u.ShortVideoUploader;

/**
 * 短视频消息的视频首帧预览图片下载实现类。
 *
 * @author Jack Jiang
 * @since 4.4
 */
//FIXME: 在更苛刻的安全性要求下，可考虑要求客户端把token字段带上来，以便进行更强的合法身份检查
public class ShortVideoThumbDownloader extends javax.servlet.http.HttpServlet
        implements javax.servlet.Servlet {
    /**
     * 默认短视频首帧预览图片
     */
    public final static String DEFAULT_THUMB_FILE_NAME = "default_short_video_thumb.jpg";

    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public ShortVideoThumbDownloader() {
        super();
    }

    /**
     * Servlet规范中本protected方法由public void service(,,)方法调用, 而public void service(,,)
     * 则由Web容器调用(所以它是public公共方法),因此一般情况下尽量避免重写public void service(,,)方法
     * ,而重写父类的本protedted方法则比较合理.
     */
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        LoggerFactory.getLog().debug("[HTTP][短视频首帧_DOWN]下载首帧预览图：你传过来的参数"
                + ",user_uid=" + req.getParameter("user_uid") // 读取图片的人（目前服务端保留，暂未使用）
                + ",video_file_md5=" + req.getParameter("video_file_md5")
                + ",thumb_image_file_name=" + req.getParameter("thumb_image_file_name")
                + ",default_thumb_if_no=" + req.getParameter("default_thumb_if_no")
                + ",[---- " + req.getContextPath() + "-" + req.getRequestURL() + "]");

        String userUid = req.getParameter("user_uid");
        String video_file_md5 = req.getParameter("video_file_md5");
        String imageFileNameToCient = req.getParameter("thumb_image_file_name");

        // 【web端专用】：此参数为“1”时，表示当没有读取到短视频预览图时，会返回默认图片（
        // 这主要用于Web网页里显示时，否则因为没有图片数据返回而会在页面上显示一个“破图”img
        // 元素，那就难看死了！）
        String _defaultThumbIfNo = req.getParameter("default_thumb_if_no");
        boolean defaultThumbIfNo = (_defaultThumbIfNo != null && _defaultThumbIfNo.equals("1"));

        try {
            // 处理图片下载
            processBinaryDownload(res
                    , userUid
                    , ShortVideoUploader.getShortVideoFileSaveDir()
                    , video_file_md5 + ".jpg"
                    , imageFileNameToCient
                    , defaultThumbIfNo);
        } catch (IOException e) {
            throw e;
        } catch (Exception e2) {
            throw new IOException(e2.getMessage(), e2.getCause());
        }
    }

    /**
     * HTTP文件下载实现方法.
     * <p>
     * 本方法没有任何异常地返回即意味着成功处理完成.
     *
     * @param res
     * @param userUid
     * @param file_dir              要下载的文件所位于的服务器磁盘目录（此dir的结尾需要"/"哦）
     * @param fileNameForServerDisk 要下载的服务端磁盘文件名
     * @param fileNameToClient      返回给客户端的文件名（客户端可以用此文件名保存在它的本地，此文件名跟fileNameForServerDisk是不同的哦）
     * @param defaultThumbIfNo      【web端专用】：此参数为“1”时，表示当没有读取到短视频预览图时，会返回默认图片（
     *                              这主要用于Web网页里显示时，否则因为没有图片数据返回而会在页面上显示一个“破图”img元素，那就难看死了！）
     * @throws IOException
     */
    private void processBinaryDownload(HttpServletResponse res
            , String userUid, String file_dir
            , String fileNameForServerDisk, String fileNameToClient
            , boolean defaultThumbIfNo) throws IOException {
        try {
            if (!CommonUtils.isStringEmpty(fileNameForServerDisk, true)
                    && !CommonUtils.isStringEmpty(fileNameToClient, true)) {
                LoggerFactory.getLog().debug("[HTTP]用户【" + userUid + "】要下载的视频首帧图片文件 " + fileNameForServerDisk
                        + "(" + fileNameToClient + ")将立即开始处理过程 ......");

                String filePath = file_dir + fileNameForServerDisk;
                File file = new File(filePath);

                // 当图片不存在时，是否需要使用默认图（使用默认图返回的情况，主要针对Web端）
                if (defaultThumbIfNo && !file.exists()) {
                    file = new File(ShortVideoThumbDownloader.class
                            .getResource(DEFAULT_THUMB_FILE_NAME).toURI());
                }

                // 实施文件下载
                FileDownload.download(res, file
                        , fileNameToClient, FileDownload.CONTENT_TYPE_JPEG, false);
            } else
                LoggerFactory.getLog().warn("[HTTP]对不起,用户【" + userUid + "】要下载的视频首帧图片(fileNameForServerDisk=" + fileNameForServerDisk + ")不存在！");
        } catch (Exception e) {
            LoggerFactory.getLog().warn("[HTTP]用户【" + userUid + "】的下载的视频首帧图片文件不存在，本次下次已提前结束(" + e.getMessage() + ")");
        }
    }
}
